home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / GAMESDS3.DMS / GAMESDS3.adf / GDS_Examples.lha / Examples / tilemap / 2wayscroller.c < prev    next >
C/C++ Source or Header  |  1994-11-14  |  10KB  |  292 lines

  1. /*
  2.  
  3.    2-Way Tilemap Scroller Example
  4.    
  5.    Clint A. Sinclair - Apr. 11, 1994 
  6.    
  7.    The demonstration lets you use the joystick to scroll the screen
  8.    left/right through a tilemap which is ten screens wide (200x10 tiles).
  9.    The tiles are 16x16 blocks, 6 bitplanes (EXTRA_HALFBRITE).
  10.    This uses a bitmap 688 pixels wide (twice the width of the display,
  11.    plus an extra row on each side and one in the middle -- makes blitting
  12.    the tiles easier).
  13.    
  14.    The files "TILES.DAT" and "MAP.DAT" must be in the current directory.
  15.    
  16.    "TILES.DAT" is the graphics data for the tiles -- each tile takes 192 
  17.    bytes (16 x 16 x 6 planes), and there are 107 tiles in the set.
  18.    "MAP.DAT" is the tilemap -- 200x10 tiles, 1 byte per tile. 
  19.    
  20.    Compiled with SAS (Lattice) V5.02.
  21.  
  22.    --------------------------------
  23.  
  24.    NOTE: graphics (c) Clint A. Sinclair 1994, all rights reserved.  This
  25.    example is included with the GameSmith development system by permission.
  26.    The graphics are not to be used for anything beyond this demo (Clint is
  27.    making a game with them and was generous enough to share).
  28.  
  29.    --------------------------------
  30.  
  31. */
  32.  
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>         /* SAS 6.0 type addition */
  36. #include <exec/types.h>
  37. #include <exec/memory.h>
  38. #include <libraries/dos.h>
  39. #include <graphics/gfxbase.h>
  40.  
  41. #include <proto/exec.h>      /* SAS 6.0 type addition */
  42. #include <proto/dos.h>      /* SAS 6.0 type addition */
  43. #include <proto/graphics.h> /* SAS 6.0 type addition */
  44.  
  45. #include <GameSmith:GameSmith.h>
  46. #include <GameSmith:include/libraries/libptrs.h>
  47.  
  48. /* Defines */
  49.  
  50. #define MAPWIDTH  200      /* Map is 200 tiles wide */
  51. #define MAPHEIGHT  10      /* Map is 10 tiles high */
  52.  
  53. #define SCREENWIDTH  20      /* Visible screen width in tiles */
  54. #define SCREENHEIGHT  10   /* Visible screen height in tiles */
  55. #define SCREENDEPTH   6      /* number of bitplanes to use */
  56.  
  57. #define NUMTILES  106      /* 106 tiles in the set */
  58. #define TILESIZE   ((16/8)*16*SCREENDEPTH)      /* tile size in bytes (width*height*depth) */
  59.  
  60. #define SCROLLSPEED  2      /* Pixels scrolled per frame - must be 1, 2, 4, or 8 in this example. */
  61.  
  62.  
  63. /* 64 colour palette */
  64. ULONG colortable[] = {
  65. 0x0,0xeebb99,0xff0000,0xbb0000,0xff6600,0xee00,0xbb00,0xee,
  66. 0xaa,0xffff33,0xcccc11,0x999911,0xedee,0xbbbb,0xbb6611,0x994411,
  67. 0x773311,0xffffff,0xcccccc,0x998899,0x99ff,0x77cc,0x11cc99,0x119977,
  68. 0xee0099,0xbb0077,0x8800dd,0x5500aa,0x556611,0x224400,0x775544,0xeeeebb,
  69. 0x0,0x775d4c,0x7f0000,0x5d0000,0x7f3300,0x7700,0x5d00,0x77,
  70. 0x55,0x7f7f19,0x666608,0x4c4c08,0x7677,0x5d5d,0x5d3308,0x4c2208,
  71. 0x3b1908,0x7f7f7f,0x666666,0x4c444c,0x4c7f,0x3b66,0x8664c,0x84c3b,
  72. 0x77004c,0x5d003b,0x44006e,0x2a0055,0x2a3308,0x112200,0x3b2a22,0x77775d
  73. };
  74.  
  75. /* For Dos Files */
  76. BPTR file=0;
  77. BPTR Open();
  78. int len=0;
  79.  
  80. struct gs_viewport vpS =
  81. {
  82.    NULL,      /* ptr to next viewport */
  83.    colortable,      /* ptr to color table */
  84.    64,         /* number of colors in table */
  85.    NULL,         /* ptr to user copper list */
  86.    SCREENHEIGHT*16,320,SCREENDEPTH,SCREENHEIGHT*16,688,   /* height, width, depth, bmheight, bmwidth */
  87.    0,0,      /* top & left viewport offsets */
  88.    16,0,      /* X & Y bitmap offsets */
  89.    GSVP_ALLOCBM,    /* flags (alloc bitmaps) */
  90.    NULL,NULL,      /* 2.xx & above compatibility stuff */
  91.    NULL,NULL,      /* bitmap pointers */
  92.    NULL,      /* future expansion */
  93.    0,0,0,0      /* display clip (MinX,MinY,MaxX,MaxY) */
  94. };
  95. struct display_struct display =
  96. {
  97.    NULL,      /* ptr to previous display view */
  98.    NULL,NULL,      /* 2.xx & above compatibility stuff */
  99.    0,0,      /* X and Y display offsets (1.3 style) */
  100.    EXTRA_HALFBRITE,         /* display mode ID */
  101.    4,4,     /* sprite priorities */
  102.    GSV_SCROLLABLE,   /* flags (scrollable) */
  103.    &vpS,      /* ptr to 1st viewport */
  104.    NULL      /* future expansion */
  105. };
  106.  
  107.  
  108. struct gs_viewport *gsvp;  /* Pointer to gs_viewport */   
  109.  
  110. struct BitMap *bm;   /* Pointer to the display bitmap */
  111.  
  112. UBYTE *tilesdata=0;   /* Pointer to chunk of chip data for tiles graphics */
  113.  
  114. UBYTE map[MAPHEIGHT][MAPWIDTH];    /* Map array - y,x (NOT x,y, because of how it's loaded in, ROW at a time.) */
  115.  
  116.  
  117. /* Struct for blitting tiles to screen (just using same struct and changing "data" pointer for each) */
  118. struct blit_struct blit =
  119. {
  120.    0,0,0,
  121.    6,0xff,1,16,32,
  122.    0,0,0,0,0,0,0
  123. };
  124.  
  125.  
  126. void BlitRow(WORD, WORD);
  127. void Quit(char *);
  128.  
  129.  
  130. int main(void)      /* MAIN */
  131. {
  132.    int joy;                  /* Value returned from joystick */
  133.    WORD x,y;               /* Positions */
  134.    WORD nextrow;            /* Number of next row in map to be scrolled onto */
  135.    
  136.    
  137.    /* Open the dos and graphics libraries */
  138.    if(gs_open_libs(DOS|GRAPHICS,0))Quit("Can't open a library!");
  139.  
  140.    /* Allocate memory for tile graphics (each tile takes 192 bytes) */
  141.    if(!(tilesdata=(UBYTE *)AllocMem(TILESIZE*NUMTILES,MEMF_CHIP)))
  142.       Quit("Not Enough Chip Memory.");
  143.    
  144.    /* Load tile graphics */
  145.    file=Open("TILES.DAT",MODE_OLDFILE);
  146.    if(file==0)Quit("Can't Open File: TILES.DAT!");
  147.    len=Read(file,(BYTE *)tilesdata,TILESIZE*NUMTILES);
  148.    if(len==-1)Quit("Can't Read File: TILES.DAT!");
  149.    Close(file);file=0;
  150.    
  151.    /* Load tilemap */
  152.    file=Open("MAP.DAT",MODE_OLDFILE);
  153.    if(file==0)Quit("Can't Open File: MAP.DAT!");
  154.    len=Read(file,(BYTE *)&map[0][0],MAPWIDTH*MAPHEIGHT);
  155.    if(len==-1)Quit("Can't Read File: MAP.DAT!");
  156.    Close(file);file=0;
  157.    
  158.    Forbid();  /* Take over the system */
  159.    
  160.    #ifdef NTSC_MONITOR_ID   /* JE: AGA mode promotion must hide too much of left */
  161.                            /* on scrollable screen.  Let's disable it. */
  162.       if (GfxBase->LibNode.lib_Version >= 36)   /* if WB 2.0 or higher */
  163.          {               /* this defeats mode promotion on AGA machines */
  164.          if (ModeNotAvailable(NTSC_MONITOR_ID))   /* select correct display type. NTSC preferred */
  165.             {
  166.             display.modes |= PAL_MONITOR_ID;
  167.             }
  168.          else
  169.             {
  170.             display.modes |= NTSC_MONITOR_ID;
  171.             }
  172.          }
  173.    #endif
  174.    /* Create the GameSmith display - 688x160x64, not double-buffered. */
  175.    if(gs_create_display(&display))Quit("Can't create display!");
  176.  
  177.    /* Actually show the new display */
  178.    gs_show_display(&display,1);  /* Sync'ed */
  179.    
  180.    gsvp=display.vp;  /* Set pointer to gs_viewport */
  181.    bm=gsvp->bitmap1;  /* Set pointer to bitmap1 */
  182.    
  183.    /* Blit first screen of tiles to the visible display (and blit the same thing again, one screen to the right) */
  184.    for(y=0;y<SCREENHEIGHT;y++)
  185.    {
  186.       for(x=0;x<=SCREENWIDTH;x++)
  187.       {
  188.             /* Set pointer to graphics data */
  189.             blit.data=(USHORT *)tilesdata+(96*(map[y][x]));
  190.             /* blit tile into bitmap (twice) */
  191.             gs_blit_copy(&blit,bm,(x<<4)+16,y<<4);   /* "<<4" == "*16" */
  192.             gs_blit_copy(&blit,bm,(x<<4)+352,y<<4);
  193.       }
  194.    }
  195.    
  196.    nextrow=SCREENWIDTH;      /* Set next row to be scrolled into (to the right) */
  197.    
  198.    
  199.    
  200.    /* The main loop  */
  201.    
  202.    for(;;)
  203.    {
  204.       
  205.       if(gs_joystick(0)&(JOY_BUTTON1|JOY_BUTTON2))break;  /* Poll mouse port - click to exit */
  206.       
  207.       joy=gs_joystick(1);   /* Poll joystick port */
  208.       
  209.       
  210.       /* If joystick is moved RIGHT */
  211.       
  212.       if(joy&JOY_RIGHT&&nextrow<MAPWIDTH)
  213.       {
  214.       
  215.       /* Wait until system has updated the last scroll we gave it before proceeding */
  216.       while(display.flags&GSV_SCROLL1);
  217.       
  218.       /* Draw tiles */
  219.       x = gsvp->xoff % 16;
  220.       if(x){y=nextrow-1;BlitRow((WORD)((gsvp->xoff-16)-x),y);}   /* If current x pos is not on even word, blit tiles _behind_ current pos. */
  221.       else {BlitRow((WORD)(gsvp->xoff+320),nextrow);nextrow++;}   /* If it is, blit tiles _ahead_ of current pos, and advance nextrow */
  222.       
  223.       /* Scroll */
  224.       if(gsvp->xoff>=(352-SCROLLSPEED))
  225.          gs_scroll_vp(&display,0,-(336-SCROLLSPEED),0,1);    /* Jump back (more than a full screen - there's an extra row in there) if reached end of bitmap */
  226.       else
  227.          gs_scroll_vp(&display,0,SCROLLSPEED,0,1);   /* Otherwise just scroll one "step" */
  228.       }
  229.  
  230.       /* If joystick is moved LEFT */
  231.       
  232.       else if(joy&JOY_LEFT&&nextrow>20)
  233.       {
  234.       
  235.       /* Wait till previous scroll is actually done */
  236.       while(display.flags&GSV_SCROLL1);
  237.       
  238.       /* Draw tiles */
  239.       x = gsvp->xoff % 16;
  240.       if(x){y=nextrow-21;if(y>=0)BlitRow((WORD)((gsvp->xoff+320)+(16-x)),y);if(x==SCROLLSPEED)nextrow--;}    /* Only blit the tiles if NOT less than tilerow 0 (y>=0) */
  241.       else {y=nextrow-21;if(y>=0)BlitRow((WORD)(gsvp->xoff-16),y);}
  242.       
  243.       /* Scroll */
  244.       if(gsvp->xoff<=(16+SCROLLSPEED))
  245.          gs_scroll_vp(&display,0,336-SCROLLSPEED,0,1);    /* Jump foreward if reached beginning of bitmap */
  246.       else
  247.          gs_scroll_vp(&display,0,-SCROLLSPEED,0,1);  /* Otherwise regular step */
  248.       }
  249.  
  250.    }
  251.    
  252.    Quit("Bye!");   /* Clean up */
  253.    
  254.    return(0);      /* (This is just to stop the compiler from giving me a warning) */
  255. }
  256.  
  257.  
  258. void BlitRow(bitmapx,mapx)   /* Draw a vertical row of tiles. bitmapx = position into bitmap (pixel pos), mapx = which row to read from tilemap. */
  259. WORD bitmapx,mapx;
  260. {
  261.    UBYTE ystep;
  262.    
  263.    for(ystep=0;ystep<SCREENHEIGHT;ystep++)
  264.    {
  265.          /* Set pointer to graphics data */
  266.          blit.data=(USHORT *)tilesdata+(96*(map[ystep][mapx]));
  267.          /* blit tile into bitmap */
  268.          gs_blit_copy(&blit,bm,bitmapx,ystep<<4);
  269.    }
  270. }
  271.  
  272.  
  273. void Quit(char *stringy)   /* Close everything and exit */
  274. {
  275.    /* Close file if open */
  276.    if(file)Close(file);
  277.    
  278.    /* Free tiles data */
  279.    if(tilesdata)FreeMem(tilesdata,TILESIZE*NUMTILES);
  280.    
  281.    /* Remove the display */
  282.    gs_remove_display(&display);
  283.    
  284.    Permit();  /* Give the system back */
  285.    
  286.    gs_close_libs();   /* Close ALL opened libraries */
  287.    
  288.    if(stringy)printf("%s\n",stringy);  /* Print error string */
  289.    
  290.    exit(0);  /* Leave */
  291. }
  292.